package cn.yc.reader;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ObjectOutputStream_ {
    public static void main(String[] args) throws Exception {
        // 序列化后，保存的文件格式不是纯文本，而是按照他的格式来保存
        String file = "e:\\io\\ioObject_Output_Stream.bat";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));

        // 序列化数据到文件
        oos.writeInt(100); // int --> Integer （实现了Serializable接口）
        oos.writeBoolean(true); // boolean --> Boolean (实现ializable接口)
        oos.writeChar('a');   // char --> Character (实现ializable接口)
        oos.writeDouble(9.5); // double --> Double (实现ializable接口)
        oos.writeUTF("hello world"); // String
        // 保存一个dog对象
        Dog wc = new Dog("旺财", 10);
        oos.writeObject(wc);

        oos.close();
        System.out.println("数据保存完毕（序列化形式）");
    }
}

class Dog implements Serializable {
    private String name;
    private int age;
    // serialVersionUID 序列化的版本号，可以提高兼容性，加了下面这个之后不会认为是一个全新的类，会认为是Dog的一个升级版
    private static final  long serialVersionUID = 1L;

    // 下面这两个不会被序列化
    private static String nation;
    private transient String color;

    // 因为下面这个Master类没有实现Serializable接口，所以不会被序列化，所以在Dog中不会被序列化，会导致报错，只有实现Serializable接口的类才能解决报错
    private Master master = new Master();
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                ", master=" + master +
                '}';
    }
}
class Master{}
